#include <cstddef>
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;
template<typename E>
struct MatrixExpression {
    double operator[](int i) const { return static_cast<const E&>(*this)[i]; }
    int size() const { return static_cast<const E&>(*this).size(); }
};

class Matrix : public MatrixExpression<Matrix> {
    std::vector<double> data;
public:
    Matrix(int size) : data(size) {}
    // 添加非const版本的operator[]
    double operator[](int i) const { return data[i]; }
    double& operator[](int i) { return data[i]; }  // 新增
    int size() const { return data.size(); }
    
    template<typename E>
    Matrix& operator=(const MatrixExpression<E>& expr) {
        for (int i = 0; i < size(); ++i)
            data[i] = expr[i];
        return *this;
    }
};
// 加法表达式模板
template<typename E1, typename E2>
struct AddExpr : MatrixExpression<AddExpr<E1, E2>> {
    const E1& a; const E2& b;
    AddExpr(const E1& a, const E2& b) : a(a), b(b) {}
    double operator[](int i) const { return a[i] + b[i]; }
    int size() const { return a.size(); }
};

// 乘法表达式模板
template<typename E1, typename E2>
struct MulExpr : MatrixExpression<MulExpr<E1, E2>> {
    const E1& a; const E2& b;
    MulExpr(const E1& a, const E2& b) : a(a), b(b) {}
    double operator[](int i) const { return a[i] * b[i]; }
    int size() const { return a.size(); }
};

// 运算符重载，生成表达式对象
template<typename E1, typename E2>
AddExpr<E1, E2> operator+(const MatrixExpression<E1>& a, const MatrixExpression<E2>& b) {
    return AddExpr<E1, E2>(static_cast<const E1&>(a), static_cast<const E2&>(b));
}

template<typename E1, typename E2>
MulExpr<E1, E2> operator*(const MatrixExpression<E1>& a, const MatrixExpression<E2>& b) {
    return MulExpr<E1, E2>(static_cast<const E1&>(a), static_cast<const E2&>(b));
}
int main()
{
    Matrix a(1000), b(1000), c(1000), d(1000);
    
    // 初始化示例数据（可选）
    for (int i = 0; i < a.size(); ++i) {
        a[i] = i * 0.1;
        b[i] = i * 0.2;
        c[i] = i * 0.3;
    }
    
    d = a + b * c;  // 执行计算
    
    // 打印结果
    for (int i = 0; i < d.size(); ++i) {
        cout << "d[" << i << "] = " << d[i] << endl;
    }
    return 0;
}